//package com.yvon.maple.gateway.filter;
//
//import cn.hutool.core.util.StrUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
//import org.springframework.cloud.gateway.filter.GlobalFilter;
//import org.springframework.core.Ordered;
//import org.springframework.http.HttpHeaders;
//import org.springframework.stereotype.Component;
//import org.springframework.web.server.ServerWebExchange;
//import org.springframework.web.util.UriComponentsBuilder;
//import reactor.core.publisher.Mono;
//
//import java.net.URI;
//import java.util.ArrayList;
//import java.util.Objects;
//
//import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;
//
//@Component
//@Slf4j
//public class WebSocketFilter implements GlobalFilter, Ordered {
//
//    private final static String TOKEN = "token=";
//
//    @Override
//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);
//        String scheme = requestUrl.getScheme();
//        if (!"ws".equals(scheme) && !"wss".equals(scheme)) {
//            return chain.filter(exchange);
//        } else {
//            String query = requestUrl.getQuery();
//            if (Objects.isNull(query)) {
//                log.error("未设置token");
//                return null;
//            }
//            String[] split = query.split("&");
//            String token = null;
//            for (String s : split) {
//                if (s.startsWith(TOKEN)) {
//                    token = s.substring(TOKEN.length());
//                    break;
//                }
//            }
//
//            if (StrUtil.isEmpty(token)) {
//                log.error("未设置token");
//                return null;
//            }
//
//            // TODO 校验
//            String wsScheme = convertWsToHttp(scheme);
//            URI wsRequestUrl = UriComponentsBuilder.fromUri(requestUrl).scheme(wsScheme).build().toUri();
//            exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, wsRequestUrl);
//        }
//
//
//
//        //解决返回多个origin信息
//        return chain.filter(exchange).then(Mono.defer(() -> {
//            exchange.getResponse().getHeaders().entrySet().stream()
//                    .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
//                    .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
//                            || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)))
//                    .forEach(kv ->
//                    {
//                        kv.setValue(new ArrayList<String>() {{
//                            add(kv.getValue().get(0));
//                        }});
//                    });
//
//            return chain.filter(exchange);
//        }));
//    }
//
//    @Override
//    public int getOrder() {
//        return Ordered.LOWEST_PRECEDENCE - 2;
//    }
//
//    private static String convertWsToHttp(String scheme) {
//        scheme = scheme.toLowerCase();
//        return "ws".equals(scheme) ? "http" : "wss".equals(scheme) ? "https" : scheme;
//    }
//}